package kylin.base.dao;

import java.io.Serializable;
import java.util.List;

import kylin.base.entity.DataTables;

import org.hibernate.Session;


public interface BaseDao<T> {

	/**
	 * <p>Methods : getSession</P>
	 * <p>Description : 获取Session</p>
	 * @Date : 2015年9月18日 下午1:13:19
	 * @return
	 */
	public Session getSession();

	/**
	 * <p>Methods : insert</P>
	 * <p>Description : 保存实体</p>
	 * @Date : 2015年9月18日 上午11:46:26
	 * @param entity
	 */
	public void insert(T entity);

	/**
	 * <p>Methods : update</P>
	 * <p>Description : 更新实体</p>
	 * @Date : 2015年9月18日 上午11:46:42
	 * @param entity
	 */
	public void update(T entity);

	/**
	 * <p>Method Name : saveOrUpdate</p>
	 * <p>Method Desc : 保存或更新</p>
	 * <p>Date : 2015-11-6 下午6:37:01</p>
	 * <p>Author : XQL</p>
	 * @param entity
	 */
	public abstract void saveOrUpdate(T entity);

	/**
	 * <p>Methods : delete</P>
	 * <p>Description : 删除实体</p>
	 * @Date : 2015年9月18日 上午11:46:52
	 * @param entity
	 */
	public void delete(T entity);

	/**
	 * <p>Methods : deleteById</P>
	 * <p>Description : 根据主键删除数据</p>
	 * @Date : 2015年9月18日 上午11:47:16
	 * @param id
	 * @throws Exception
	 */
	public void deleteById(Serializable id);

	/**
	 * <p>Methods : deleteByIds</P>
	 * <p>Description : 根据主键批量删除数据</p>
	 * @Date : 2015年9月18日 下午1:34:23
	 * @param ids
	 */
	public void deleteByIds(List<Object> idList);

	/**
	 * <p>Method Name : executeHQL</p>
	 * <p>Method Desc : 执行HQL语句[增、删、改]</p>
	 * @Date 2015年9月19日 下午6:23:33
	 * @Author XQL
	 * @param hql
	 * @param params
	 * @return
	 */
	public boolean executeHQL(String hql,Object ... params);

	/**
	 * <p>Methods : get</P>
	 * <p>Description : 根据主键查询实体</p>
	 * @Date : 2015年9月18日 上午11:52:47
	 * @param id
	 * @return
	 * @throws Exception
	 */
	public T get(Serializable id);

	/**
	 * <p>Method Name : findByIdList</p>
	 * <p>Method Desc : list条件查询多条数据</p>
	 * @Date 2015年9月19日 下午4:49:05
	 * @Author XQL
	 * @param idList
	 * @return
	 */
	public List<T> findByIdList(List<Object> idList);

	/**
	 * <p>Methods : findByAll</P>
	 * <p>Description : 查询所有数据</p>
	 * @Date : 2015年9月18日 下午1:06:14
	 * @return
	 * @throws Exception
	 */
	public List<T> findByAll();

	/**
	 * <p>Method Name : findByEntity</p>
	 * <p>Method Desc : 根据实体查询数据</p>
	 * @Date 2015年9月19日 下午1:05:24
	 * @Author XQL
	 * @param entity
	 * @return
	 */
	public List<T> findByEntity(final T entity);

	/**
	 * <p>Method Name : findByHQL</p>
	 * <p>Method Desc : 通用HQL查询全部数据</p>
	 * @Date 2015年9月19日 下午1:22:31
	 * @Author XQL
	 * @param hql
	 * @param params
	 * @return
	 */
	public List<T> findByHQL(final String hql,final Object ... params);

	/**
	 *  <p>Description : 通用HQL查询全部数据,不指定List对象</p>
	 * <p>Author : XQL</p>
	 * <p>Date : 2016/1/30 15:34</p>
	 *
	 * @param hql hql语句
	 * @param params 参数
     * @return
     */
	Object find4Object(String hql, Object... params);

	/**
	 * <p>Method Name : findByCount</p>
	 * <p>Method Desc : 查询总记录数据</p>
	 * @Date 2015年9月19日 下午5:49:37
	 * @Author XQL
	 * @param hql 可以为null，为null时默认无条件查询总条数
	 * @param params
	 * @return
	 */
	public int findByCount(String hql,final Object ... params);

	/**
	 * <p>Method Name : findByHQL</p>
	 * <p>Method Desc : 通用HQL查询部分数据</p>
	 * @Date 2015年9月19日 下午1:39:50
	 * @Author XQL
	 * @param start
	 * @param length
	 * @param hql
	 * @param params
	 * @return
	 */
	public List<T> findByHQL(final int start,final int length,final String hql,final Object ... params);

	/**
	 * <p>Methods : findByPage</P>
	 * <p>Description : 通用HQL分页查询返回DataTables对象</p>
	 * @Date : 2015年9月10日 下午1:55:18
	 * @param hql HQL语句
	 * @param dt DataTables对象
	 * @param params HQL语句参数集
	 * @return
	 */
	public void findByPage(String hql, DataTables dt,Object... params);

}
